home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / seyon / SeIo.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  5KB  |  329 lines

  1.  
  2. /*
  3.  * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M.
  4.  * Saggaf. All rights reserved.
  5.  *
  6.  * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full
  7.  * statement of rights and permissions for this program.
  8. */
  9.  
  10. #include "config.h"
  11. #include <stdio.h>
  12. #include <errno.h>
  13. #include <sys/ioctl.h>
  14.  
  15. #if HAVE_TERMIOS
  16. #include <termios.h>
  17. #else
  18.  
  19. #if HAVE_TERMIO
  20. #include <termio.h>
  21. #endif
  22. #endif
  23.  
  24. #if HAVE_SGTTY
  25. #include <sys/file.h>
  26. #endif
  27. #if HAVE_MODEM_CONTROL && defined(HPUX)
  28. #include <sys/modem.h>
  29. #endif
  30.  
  31. #include <X11/Intrinsic.h>
  32.  
  33. #include "SeDecl.h"
  34.  
  35. int
  36. io_set_attr(fd, io)
  37.      int             fd;
  38.  
  39. #if HAVE_TERMIOS
  40.      struct termios *io;
  41. {
  42.   int             res;
  43.   res = tcsetattr(fd, TCSADRAIN, io);
  44. #else
  45. #if HAVE_TERMIO
  46.      struct termio  *io;
  47. {
  48.   int             res;
  49.   res = ioctl(fd, TCSETAW, io);
  50. #else
  51. #if HAVE_SGTTYB
  52.      struct sgttyb *io;
  53. {
  54.   int res;
  55.   res = ioctl(fd, TIOCSETP, io);
  56. #endif
  57. #endif
  58. #endif
  59.  
  60.   if (res < 0)
  61.     SePError("ioctl-set");
  62.   return res;
  63. }
  64.  
  65. int
  66. io_get_attr(fd, io)
  67.      int             fd;
  68.  
  69. #if HAVE_TERMIOS
  70.      struct termios *io;
  71. {
  72.   int             res;
  73.   res = tcgetattr(fd, io);
  74. #else
  75. #if HAVE_TERMIO
  76.      struct termio  *io;
  77. {
  78.   int             res;
  79.   res = ioctl(fd, TCGETA, io);
  80. #else
  81. #if HAVE_SGTTYB
  82.      struct sgttyb *io;
  83. {
  84.   int res;
  85.   res = ioctl(fd, TIOCGETP, io);
  86. #endif
  87. #endif
  88. #endif
  89.  
  90.   if (res < 0)
  91.     SePError("ioctl-get");
  92.   return res;
  93. }
  94.  
  95. int
  96. TtyIFlush(fd)
  97.      int             fd;
  98. {
  99.   int             res;
  100.  
  101. #if HAVE_TERMIOS
  102.   res = tcflush(fd, TCIFLUSH);
  103. #else
  104. #if HAVE_TERMIO
  105.   res = ioctl(fd, TCFLSH, 0);
  106. #else
  107. #if HAVE_SGTTYB
  108.   res = ioctl(fd, TIOCFLUSH, FREAD);
  109. #endif
  110. #endif
  111. #endif
  112.  
  113.   if (res < 0)
  114.     SePError("ioctl-iflush");
  115.   return res;
  116. }
  117.  
  118. int
  119. TtyOFlush(fd)
  120.      int             fd;
  121. {
  122.   int             res;
  123.  
  124. #if HAVE_TERMIOS
  125.   res = tcflush(fd, TCOFLUSH);
  126. #else
  127. #if HAVE_TERMIO
  128.   res = ioctl(fd, TCFLSH, 1);
  129. #else
  130. #if HAVE_SGTTYB
  131.   res = ioctl(fd, TIOCFLUSH, FWRITE);
  132. #endif
  133. #endif
  134. #endif
  135.  
  136.   if (res < 0)
  137.     SePError("ioctl-oflush");
  138.   return res;
  139. }
  140.  
  141. int
  142. TtyIOFlush(fd)
  143.      int             fd;
  144. {
  145.   int             res;
  146.  
  147. #if HAVE_TERMIOS
  148.   res = tcflush(fd, TCIOFLUSH);
  149. #else
  150. #if HAVE_TERMIO
  151.   res = ioctl(fd, TCFLSH, 2);
  152. #else
  153. #if HAVE_SGTTYB
  154.   res = ioctl(fd, TIOCFLUSH, 0);
  155. #endif
  156. #endif
  157. #endif
  158.  
  159.   if (res < 0)
  160.     SePError("ioctl-ioflush");
  161.   return res;
  162. }
  163.  
  164. int
  165. io_send_break(fd)
  166.      int             fd;
  167. {
  168.   int             res;
  169.  
  170. #if HAVE_TERMIOS
  171.   res = tcsendbreak(fd, 0);
  172. #else
  173. #if HAVE_TERMIO
  174.   res = ioctl(fd, TCSBRK, 0);
  175. #else
  176. #if HAVE_SGTTYB
  177.   res = ioctl(fd, TIOCSBRK);
  178.   if (!res) {
  179.     sleep(1);
  180.     ioctl(fd, TIOCCBRK);
  181.   }
  182. #endif
  183. #endif
  184. #endif
  185.  
  186.   return res;
  187. }
  188.  
  189. void
  190. io_set_speed(io, speed)
  191. #if HAVE_TERMIOS
  192.      struct termios *io;
  193.      speed_t         speed;
  194. {
  195.   cfsetospeed(io, speed);
  196.   cfsetispeed(io, speed);
  197.  
  198. #else
  199. #if HAVE_TERMIO
  200.      struct termio  *io;
  201.      speed_t         speed;
  202. {
  203.   io->c_cflag &= ~CBAUD;
  204.   io->c_cflag |= speed;
  205. #else
  206. #if HAVE_SGTTYB
  207.      struct sgttyb *io;
  208.      speed_t speed;
  209. {
  210.   io->sg_ispeed = io->sg_ospeed = speed;
  211. #endif
  212. #endif
  213. #endif
  214. }
  215.  
  216. speed_t
  217. io_get_speed(io)
  218. #if HAVE_TERMIOS
  219.      struct termios *io;
  220. {
  221.   return cfgetospeed(io);
  222.  
  223. #else
  224. #if HAVE_TERMIO
  225.      struct termio  *io;
  226. {
  227.   return io->c_cflag & CBAUD;
  228. #else
  229. #if HAVE_SGTTYB
  230.      struct sgttyb *io;
  231. {
  232.   return io->sg_ispeed;
  233. #endif
  234. #endif
  235. #endif
  236. }
  237.  
  238. int
  239. IoGetModemStat(fd)
  240.      int fd;
  241. {
  242. #if HAVE_MODEM_CONTROL
  243. #ifndef HPUX9
  244.   int      rawStat;
  245. #else
  246.   mflag    rawStat;
  247. #endif
  248. #endif
  249.  
  250.   int      retStat, res;
  251.  
  252.   /*
  253.     Please note: You do NOT need modem control in order to use Seyon. This
  254.     feature is not essential to Seyon and all you get from it is a nice 
  255.     display of modem status lines and a clock of on-line time. If your 
  256.     system doesn't support this feature (i.e. the code below won't compile),
  257.     all you have to do is this:
  258.     
  259.          1) define HAVE_MODEM_CONTROL to be NO under your system's 
  260.             entry in in config.h
  261.          2) put the resource: 
  262.                  Seyon.ignoreModemDCD: on
  263.             in your ~/.Xresources file
  264.             */
  265.  
  266. #if HAVE_MODEM_CONTROL
  267. #ifndef HPUX
  268.   res = ioctl(fd, TIOCMGET, &rawStat);
  269. #else
  270.   res = ioctl(fd, MCGETA, &rawStat);
  271. #endif
  272.   if (res < 0) {
  273.     SePError("ioctl-getmdm");
  274.     return -1;
  275.   }
  276. #endif
  277.  
  278.   retStat = 0;
  279.  
  280. #if HAVE_MODEM_CONTROL
  281. #ifndef HPUX
  282. #ifdef TIOCM_CAR
  283.   if (rawStat & TIOCM_CAR) retStat |= MDM_DCD;
  284. #endif
  285. #ifdef TIOCM_DTR
  286.   if (rawStat & TIOCM_DTR) retStat |= MDM_DTR;
  287. #endif
  288. #ifdef TIOCM_DSR
  289.   if (rawStat & TIOCM_DSR) retStat |= MDM_DSR;
  290. #endif
  291. #ifdef TIOCM_RTS
  292.   if (rawStat & TIOCM_RTS) retStat |= MDM_RTS;
  293. #endif
  294. #ifdef TIOCM_CTS
  295.   if (rawStat & TIOCM_CTS) retStat |= MDM_CTS;
  296. #endif
  297. #ifdef TIOCM_RNG
  298.   if (rawStat & TIOCM_RNG) retStat |= MDM_RNG;
  299. #endif
  300. #else /* HPUX */
  301.   /* Note: I'm note sure about the symbol names of HPUX. I used the same 
  302.      symbols as those used by kermit, but even there there is a comment
  303.      that the author is not sure about the symbol names. Someone who has
  304.      HPUX please let me know */
  305. #ifdef MDCD
  306.   if (rawStat & MDCD) retStat |= MDM_DCD;
  307. #endif
  308. #ifdef MDTR
  309.   if (rawStat & MDTR) retStat |= MDM_DTR;
  310. #endif
  311. #ifdef MDSR
  312.   if (rawStat & MDSR) retStat |= MDM_DSR;
  313. #endif
  314. #ifdef MRTS
  315.   if (rawStat & MRTS) retStat |= MDM_RTS;
  316. #endif
  317. #ifdef MCTS
  318.   if (rawStat & MCTS) retStat |= MDM_CTS;
  319. #endif
  320. #ifdef MRNG
  321.   if (rawStat & MRI) retStat |= MDM_RNG;
  322. #endif
  323. #endif /* HPUX */
  324. #endif /* HAVE_MODEM_CONTROL */
  325.   
  326.   return retStat;
  327. }
  328.  
  329.